#namedtuple用来表示一个坐标
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1,2)

#如果要用坐标和半径表示一个圆，也可以用namedtuple
Circle = namedtuple('Circle', ['x', 'y', 'r'])
cir1 = Circle(1,3,2)

#list是线性存储，数据量大的时候，插入和删除效率很低。
#deque是为了高效实现插入和删除操作的双向列表，适合用于队列和栈
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
print(q)
#deque除了实现list的append()和pop()外，还支持appendleft()和popleft()

#使用dict时，如果引用的Key不存在，就会抛出KeyError。
#如果希望key不存在时，返回一个默认值，就可以用defaultdict
from collections import defaultdict
dic = defaultdict(lambda : 'error')
dic['key1'] = 'abc'
print(dic['key1'])
print(dic['key2'])

#使用dict时，Key是无序的.如果要保持Key的顺序，可以用OrderedDict
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3),('d', 4)])
print(d)
od = OrderedDict([('a', 1), ('b', 2), ('c', 3),('d', 4)])
print(od)

#OrderedDict的Key会按照插入的顺序排列，不是Key本身排序
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
print(list(od.keys()))

#OrderedDict可以实现一个FIFO（先进先出）的dict
#当容量超出限制时，先删除最早添加的Key
from collections import OrderedDict

class LastUpdatedOrderedDict(OrderedDict):

    def __init__(self, capacity):
        super(LastUpdatedOrderedDict, self).__init__()
        self._capacity = capacity

    def __setitem__(self, key, value):
        containsKey = 1 if key in self else 0
        if len(self) - containsKey >= self._capacity:
            last = self.popitem(last=False)
            print('remove:', last)
        if containsKey:
            del self[key]
            print('set:', (key, value))
        else:
            print('add:', (key, value))
        OrderedDict.__setitem__(self, key, value)


#ChainMap可以把一组dict串起来并组成一个逻辑上的dict
from collections import ChainMap
import os, argparse
# 构造缺省参数:
defaults = {
    'color': 'red',
    'user': 'guest'
}
# 构造命令行参数:
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = { k: v for k, v in vars(namespace).items() if v }
# 组合成ChainMap:
combined = ChainMap(command_line_args, os.environ, defaults)
# 打印参数:
print('color=%s' % combined['color'])
print('user=%s' % combined['user'])

#Counter是一个简单的计数器
from collections import Counter
c = Counter()
for ch in 'programming':
    c[ch] += 1
print(c)